/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Dao;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

/**
 *
 * @author Andre
 */
public class DAO {
    
    /**
     * Função genéria que formula o comando UPDATE para a alteração de uma unica coluna e o retona em uma String 
     * 
     * @param tabela String Contendo o nome da tabela desejada
     * @param coluna nome coluna que será alterada
     * @param parametro parametro de preechemento da respectiva coluna
     * @param condicao String contendo a condição de alteração  exemplo : WHERE codigo=10
     * @return Retorna uma String contendo o comando UPDATE na linguagem SQL
     * @exception Caso ocora uma exception retorna uma String vazia ""
     */
    public static String fomulaComandoUpdate(String tabela, String coluna, String parametro, String condicao ){
        String update="";
        try{
            update="UPDATE "+tabela+" SET ";
            update = update+coluna+"="+"'"+parametro+"'";
            update = update+" "+condicao+"";
            System.out.println(update);
            return update;
        }catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        return "";
    }
    
    /**
     * Função genéria que formula o comando UPDATE em DAO e o retona em uma String 
     * 
     * @param tabela String Contendo o nome da tabela desejada
     * @param colunas ArrayList contendo o nome de todas as colunas que serão alteradas
     * @param parametros ArrayList contendo os parametros de preechemento das respectivas colunas
     * @param condicao String contendo a condição de alteração  exemplo : WHERE codigo=10
     * @return Retorna uma String contendo o comando UPDATE na linguagem SQL
     * @exception Caso ocora uma exception retorna uma String vazia ""
     */
    public static String fomulaComandoUpdate(String tabela, ArrayList<String> colunas, ArrayList<String> parametros, String condicao ){
        String update="";
        try{
            update="UPDATE "+tabela+" SET ";
            for (int i = 0; i < colunas.size(); i++) {
                if(i==0)
                    update = update+colunas.get(i)+"="+"'"+parametros.get(i)+"'";
                else
                    update = update+", "+colunas.get(i)+"="+"'"+parametros.get(i)+"'";
            }
            update = update+" "+condicao+"";
            System.out.println(update);
            return update;
        }catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        return "";
    }
    
    /**
     * Função genéria que formula o comando UPDATE em DAO e o retona em uma String 
     * 
     * @param p do tipo PametrosBD, que possui todos os dados necessarios para formular o comando update 
     * @return Retorna uma String contendo o comando UPDATE na linguagem SQL
     */
    public static String fomulaComandoUpdate(ParametrosBD p ){
        String update="";
        try{
            update="UPDATE "+p.getTabela()+" SET ";
            for (int i = 0; i < p.getColunas().size(); i++) {
                if(i==0)
                    update = update+p.getColunas().get(i)+"="+"'"+p.getParametros().get(i)+"'";
                else
                    update = update+", "+p.getColunas().get(i)+"="+"'"+p.getParametros().get(i)+"'";
            }
            update = update+" "+p.getCondicao()+"";
            update = update.replace("'null'", "null");
            System.out.println(update);
            return update;
        }catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        return "";
    }
    
    /**
     * Função genéria que formula o comando INSERT e o retona em uma String 
     * 
     * @param tabela String Contendo o nome da tabela desejada
     * @param colunas ArrayList contendo o nome de todas as colunas que serão alteradas
     * @param parametros ArrayList contendo os parametros de preechemento das respectivas colunas
     * @return Retorna uma String contendo o comando UPDATE na linguagem SQL
     * @exception Caso ocora uma exception retorna uma String vazia ""
     */
    public static String fomulaComandoInsert(String tabela, ArrayList<String> colunas, ArrayList<String> parametros ){
        String insert="";
        //INSERT INTO agente (codigo, nome, data_entrada) VALUES('"+cod+"','"+jTnomeNA.getText()+"','"+dataEntrada+"')"
        try{
            insert="INSERT INTO "+tabela+" (";
            for (int i = 0; i < colunas.size(); i++) {
                if(i==0)
                    insert = insert+colunas.get(i); 
                else
                    insert = insert+", "+colunas.get(i);
            }
            
            insert=insert+") VALUES(";
            
            for (int i = 0; i < parametros.size(); i++) {
                if(i==0)
                    insert = insert+"'"+parametros.get(i)+"'";
                else
                    insert = insert+", "+"'"+parametros.get(i)+"'";
            }
            insert = insert+")";
            System.out.println(insert);
            return insert;
        }catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        return "";
    }
    
    /**
     * Função genéria que formula o comando INSERT em DAO e o retona em uma String 
     * 
     * @param p do tipo PametrosBD, que possui todos os dados necessarios para formular o comando insert 
     * @return Retorna uma String contendo o comando INSERT na linguagem SQL
     */
    public static String fomulaComandoInsert(ParametrosBD p){
        String insert="";
        
        try{
            insert="INSERT INTO "+p.getTabela()+" (";
            for (int i = 0; i < p.getColunas().size(); i++) {
                if(i==0)
                    insert = insert+p.getColunas().get(i); 
                else
                    insert = insert+", "+p.getColunas().get(i);
            }
            
            insert=insert+") VALUES(";
            
            for (int i = 0; i < p.getParametros().size(); i++) {
                if(i==0)
                    insert = insert+"'"+p.getParametros().get(i)+"'";
                else
                    insert = insert+", "+"'"+p.getParametros().get(i)+"'";
            }
            insert = insert+")";
            System.out.println(insert);
            return insert;
        }catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        return "";
    }
    
    
    /**
     * Função genéria que formula o comando SELECT* e o retona em uma String 
     * 
     * @param p do tipo PametrosBD, que possui todos os dados necessarios para formular o comando insert 
     * @return Retorna uma String contendo o comando SELECT* na linguagem SQL
     */
    public static String fomulaComandoSelectAll(ParametrosBD p){
        //"SELECT * FROM acompanhamento_suspeito WHERE id_acomp="+idacomp+""
        String select="";
        
        try{
            select="SELECT * FROM "+p.getTabela()+ p.getCondicao();
            System.out.println(select);
            return select;
        }catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        return "";
    }
    
    /**
     * Função genéria que formula o comando SELECT* e o retona em uma String 
     * 
     * @param tabela nome da tabela 
     * @param condicao condiçao de busca
     * @return Retorna uma String contendo o comando SELECT* na linguagem SQL
     */
    public static String fomulaComandoSelectAll(String tabela, String condicao){
        //"SELECT * FROM acompanhamento_suspeito WHERE id_acomp="+idacomp+""
        String select="";
        
        try{
            select="SELECT * FROM "+tabela+ condicao;
            System.out.println(select);
            return select;
        }catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        return "";
    }
    
    /**
     * Função genéria que formula o comando SELECT e o retona em uma String   
     * @param tabela nome da tabela 
     * @param coluna nome da coluna na qual sera realizada a busca
     * @param condicao condicao da busca
     * @return Retorna uma String contendo o comando SELECT na linguagem SQL
     */
    public static String fomulaComandoSelectColuna(String tabela, String coluna, String condicao){
        String select="";
        try{
            select="SELECT "+coluna+" FROM "+tabela+ condicao;
            System.out.println(select);
            return select;
        }catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        return "";
    }
    /**
     * Função genéria que formula o comando SELECT e o retona em uma String 
     * 
     * @param p do tipo PametrosBD, que possui todos os dados necessarios para formular o comando insert 
     * @return Retorna uma String contendo o comando SELECT na linguagem SQL
     */
    public static String fomulaComandoSelectColuna(String coluna,ParametrosBD p){
        String select="";
        try{
            select="SELECT "+coluna+" FROM "+p.getTabela()+ p.getCondicao();
            System.out.println(select);
            return select;
        }catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        return "";
    }
    
    /**
     * Função genéria que formula e executa o comando UPDATE de uma unica coluna de uma determinada tabela na Linguagem SQL 
     * 
     * @param tabela String Contendo o nome da tabela desejada
     * @param coluna coluna que será alterada
     * @param parametro a informação a ser preechida na respectiva coluna
     * @param condicao String contendo a condição de alteração  exemplo : WHERE codigo=10
     * @return Retorna true se a função foi executada com sucesso. Caso contrário retona false  
     */
    public static boolean update(String tabela, String coluna,String parametro, String condicao){
        return(Singleton.executeSQL(fomulaComandoUpdate(tabela, coluna, parametro, condicao)));
    }
    
    /**
     * Função genéria que formula e executa o comando UPDATE da Linguagem SQL 
     * 
     * @param tabela String Contendo o nome da tabela desejada
     * @param colunas ArrayList contendo o nome de todas as colunas que serão alteradas
     * @param parametros ArrayList contendo os parametros de preechemento das respectivas colunas
     * @param condicao String contendo a condição de alteração  exemplo : WHERE codigo=10
     * @return Retorna true se a função foi executada com sucesso. Caso contrário retona false  
     */
    public static boolean update(String tabela, ArrayList<String> colunas, ArrayList<String> parametros, String condicao){
        return(Singleton.executeSQL(fomulaComandoUpdate(tabela, colunas, parametros, condicao)));
    }
    
    /**
     * Função genéria que formula e executa o comando UPDATE da Linguagem SQL 
     * 
     * @param parametros do tipo ParametrosBD onde contem todos os dados necessarios para criar um comando update em SQL
     * @return Se a alteração foi realizada com sucesso retonar true, caso contrario false.
     */
    public static boolean update(ParametrosBD parametros){
        return(Singleton.executeSQL(fomulaComandoUpdate(parametros)));
    }
    
    /**
     * Função genéria que formula e executa o comando INSERT da Linguagem SQL 
     * 
     * @param tabela String Contendo o nome da tabela desejada
     * @param colunas ArrayList contendo o nome de todas as colunas que serão alteradas
     * @param parametros ArrayList contendo os parametros de preechemento das respectivas colunas
     * @return Retorna true se a função foi executada com sucesso. Caso contrário retona false  
     */
    public static boolean insert(String tabela, ArrayList<String> colunas, ArrayList<String> parametros){
        return(Singleton.executeSQL(fomulaComandoInsert(tabela, colunas, parametros)));
    }
    
    /**
     * Função genéria que formula e executa o comando INSERT da Linguagem SQL 
     * 
     * @param parametros do tipo ParametrosBD onde contem todos os dados necessarios para criar um comando Insert em SQL
     * @return Se a inserção foi realizada com sucesso retonar true, caso contrario false.
     */
    public static boolean insert(ParametrosBD parametros){
        return(Singleton.executeSQL(fomulaComandoInsert(parametros)));
    }
    
    /**
     * Função genéria que formula e executa o comando INSERT da Linguagem SQL retornando um valor de uma coluna especifica
     * 
     * @param parametros do tipo ParametrosBD onde contem todos os dados necessarios para criar um comando Insert em SQL
     * @return Se a inserção foi realizada com sucesso retonar true, caso contrario false.
     */
    public static int insertRetornoPK(ParametrosBD parametros,String colunaRetorno){
        try{
            Statement stm = Singleton.executeSQLStatement(fomulaComandoInsert(parametros)+"RETURNING "+colunaRetorno);
            ResultSet result = stm.getResultSet();
            result.next();
            return result.getInt(colunaRetorno);
        }
        catch(Exception ex){
            System.out.println("erro: "+ex.getMessage());
            return -1;
        }
    }
    
    /**
     * Função genéria que formula e executa o comando SELECT* da Linguagem SQL 
     * 
     * @param parametros
     * @return Retorna um ResultSet contendo todos os dados do comando SELECT*
     */
    public static ResultSet selectAll(ParametrosBD parametros){
        try{
            Statement stm = Singleton.executeSQLStatement(fomulaComandoSelectAll(parametros));
            ResultSet result = stm.getResultSet();
            return result;
        }
        catch(Exception ex){
            System.out.println(ex.getMessage());
            return null;
        }
    }
    
    public static ResultSet selectAll(String tabela, String condicao){
        String retorno = "";
        try{
            Statement stm = Singleton.executeSQLStatement(fomulaComandoSelectAll(tabela,condicao));
            return stm.getResultSet();
        }
        catch(Exception ex){
            System.out.println(ex.getMessage());
            return null;
        }
    }
    
    public static String selectColuna(String tabela, String coluna, String condicao){
        String retorno = "";
        try{
            Statement stm = Singleton.executeSQLStatement(fomulaComandoSelectColuna(tabela,coluna,condicao));
            ResultSet result = stm.getResultSet();
            while(result.next()){              
                retorno = result.getString(coluna);
            }
            return retorno;
        }
        catch(Exception ex){
            System.out.println(ex.getMessage());
            return "";
        }
    }
    
    public static ResultSet comandoSQL(String ComandoSQL){
        System.out.println(ComandoSQL);
        try{
            Statement stm = Singleton.executeSQLStatement(ComandoSQL);
            return stm.getResultSet();
        }
        catch(Exception ex){
            System.out.println("Opa"+ex.getMessage());
            return null;
        }
    }
    
    public static ResultSet selectSQL(String ComandoSQL){
        try{
            Statement stm = Singleton.executeSQLStatement(ComandoSQL);
            System.out.println("aqui merda  " );
            ResultSet result = stm.getResultSet();
            result.next();
            System.out.println(result.getString("nome"));
            return result;
        }
        catch(Exception ex){
            System.out.println(ex.getMessage());
            return null;
        }
    }
    
    // Exemplo de delete
    // DELETE FROM nometabela WHERE coluna = parametro
}
